//封装一个发布订阅模式
//一个中间人，发布者 订阅者
interface IEventsContainer {
  [key: string]: Function[];
}
const events: IEventsContainer = {};

const EventBus = {
  // 订阅方法
  // 把事件对应的 方法 存起来
  on(type: string, callback: Function) {
    // 把方法和对应的事件关联并存储
    !events[type] && (events[type] = []);
    // 上面的写法是下面这个判断的简写
    // if (!events[type]) {
    //   events[type] = [];
    // }
    events[type].push(callback);
  },
  // 发布方法
  // 把事件应对方法调用
  emit(type: string) {
    events[type] && events[type].forEach((fn) => fn());
  },
};

export default EventBus;
